package com.tn.requestQueue.impl
{
	import com.tn.requestQueue.IRequestQueue;
	import mx.rpc.IResponder;

	public class RequestQueue implements IRequestQueue, IResponder
	{

		/*============================================================================*/
		/* Public Properties                                                          */
		/*============================================================================*/

		public function get hasQueueItems():Boolean
		{
			return queue && (queue.length > 0);
		}

		/*============================================================================*/
		/* Private Properties                                                         */
		/*============================================================================*/

		private var queue:Array;

		private var running:Boolean;


		/*============================================================================*/
		/* Public Functions                                                           */
		/*============================================================================*/

		public function addRequest(item:Function):void
		{
			if (item != null)
				addRequestToQueue(item);
		}

		/**
		 * IResponder Listener Event
		 * @param data
		 *
		 */
		public function fault(info:Object):void
		{
			queueItemComplete();
		}

		/**
		 * IResponder Listener Event
		 * @param data
		 *
		 */
		public function result(data:Object):void
		{
			queueItemComplete();
		}

		/*============================================================================*/
		/* Internal Functions                                                         */
		/*============================================================================*/

		internal function start():void
		{
			if (running)
				return;

			(running = true) && queueNextItem();
		}

		internal function stop():void
		{
			running = false;
		}

		/*============================================================================*/
		/* Private Functions                                                          */
		/*============================================================================*/

		private function addRequestToQueue(item:Function):void
		{
			queue ||= [];
			queue.push(item) && start();
		}

		private function queueItemComplete():void
		{
			hasQueueItems
				? queueNextItem()
				: stop();
		}

		private function queueNextItem():void
		{
			queue.shift()().addResponder(this);
		}
	}
}
